home *** CD-ROM | disk | FTP | other *** search
- // Source Code generated by PatchMaker 1.0
- // a sick idea by Paul Baxter
-
- #if TARGET_CPU_68K && !TARGET_RT_MAC_CFM
- #error Sorry Can't do that
- #endif
-
- #include <MixedMode.h>
- #include <Appearance.h>
- #include <SpeechSynthesis.h>
- //#include <A4Stuff.h> // Where is this?
-
- // This seems to replace A4Stuff.h
- #ifndef powerc
-
- #define EnterCodeResource() long oldA4 = SetCurrentA4()
- #define ExitCodeResource() SetA4(oldA4)
- long SetCurrentA4(void);
- long SetA4(long:__D0):__D0 = 0xC18C;
- long GetCurrentA4(void) = 0x200C;
- pascal void UnloadA4Seg(void *);
-
- #else
-
- #define EnterCodeResource()
- #define ExitCodeResource()
- #define SetCurrentA4() 0L
- #define SetA4(x) 0L
- #define GetCurrentA4() 0L
- #define UnloadA4Seg(x) 0
-
- #endif
-
- // enums for routinedescriptor
- enum {
- upp_DragWindowProcInfo = kPascalStackBased
- | STACK_ROUTINE_PARAMETER(1,kFourByteCode)
- | STACK_ROUTINE_PARAMETER(2,kFourByteCode)
- | STACK_ROUTINE_PARAMETER(3,kFourByteCode),
- upp_NewCWindowProcInfo = kPascalStackBased
- | RESULT_SIZE(kFourByteCode)
- | STACK_ROUTINE_PARAMETER(1,kFourByteCode)
- | STACK_ROUTINE_PARAMETER(2,kFourByteCode)
- | STACK_ROUTINE_PARAMETER(3,kFourByteCode)
- | STACK_ROUTINE_PARAMETER(4,kOneByteCode)
- | STACK_ROUTINE_PARAMETER(5,kTwoByteCode)
- | STACK_ROUTINE_PARAMETER(6,kFourByteCode)
- | STACK_ROUTINE_PARAMETER(7,kOneByteCode)
- | STACK_ROUTINE_PARAMETER(8,kFourByteCode),
- upp_SelectWindowProcInfo = kPascalStackBased
- | STACK_ROUTINE_PARAMETER(1,kFourByteCode),
- uppPatcExtraInfo
- };
-
- #define kSwell 15
- #define kVOffset 5
- #define kHOffset 6
-
- #define Rand(min, max) (((Random() & 0x7FFF) % ((max)-(min))) + (min))
-
- static gInMoveWindows = false;
-
- void Swell(Rect * foo);
- void Initalize(void);
- pascal OSStatus GetWindowBounds(WindowRef window, WindowRegionCode regionCode, Rect *globalBounds);
- void MoveWindows(void);
-
- SndChannelPtr theChannel;
-
- static void Initialize(void)
- {
- SndNewChannel(&theChannel, sampledSynth, initMono, NULL);
- }
-
- pascal OSStatus GetWindowBounds(WindowRef window,
- WindowRegionCode regionCode,Rect *globalBounds)
- {
- OSStatus anErr = noErr;
- // GrafPtr savePort;
- Rect tRect;
-
- (regionCode);
-
- // GetPort(&savePort);
- // SetPort(window);
-
- tRect = (*((WindowPeek) window)->contRgn)->rgnBBox;
-
- if (nil != globalBounds)
- *globalBounds = tRect;
- else
- anErr = paramErr;
-
- // SetPort(savePort);
-
- return anErr;
- }
-
- void Swell(Rect * swellee)
- {
- swellee->left -= kSwell;
- if (swellee->left < 0)
- swellee->left = 1;
-
- swellee->right += kSwell;
- swellee->top -= kSwell/2;
- if (swellee->top < 0)
- swellee->top = 1;
-
- swellee->bottom += kSwell*2;
- }
-
- void MoveWindows(void)
- {
- WindowPeek baseWindow;
- Rect wRect = { 20,20,200,820}, mainRect;
- Handle wHandle = nil, dHandle = nil;
- GDHandle tGDHandle = LMGetMainDevice();
- PixMapHandle tPixMapHdl = (*tGDHandle)->gdPMap;
- Rect sRect = (*tPixMapHdl)->bounds;
- short d1=0;
-
- DebugStr("\pBefore");
- if (gInMoveWindows)
- return;
- DebugStr("\pAfter");
- gInMoveWindows = true;
-
- baseWindow = (WindowPeek) LMGetWindowList();
- if (nil == baseWindow)
- return;
-
- //wHandle = GetResource('snd ', 128);
- //dHandle = GetResource('snd ', 129);
-
- if (wHandle)
- {
- HLock(wHandle);
- SndPlay(theChannel, (SndListHandle) wHandle, false);
- SndPlay(theChannel, (SndListHandle) wHandle, false);
- HUnlock(wHandle);
- }
-
- (void) GetWindowBounds((WindowPtr) baseWindow,kWindowGlobalPortRgn,&mainRect);
- Swell(&mainRect);
-
- while (nil != baseWindow)
- {
- Point tDelta;
- short direction=++d1;
- Rect tRect;
- baseWindow = baseWindow->nextWindow;
- if (nil==baseWindow) return;
- if(direction > 3)
- {
- direction = 0;
- d1=1;
- }
-
- (void) GetWindowBounds((WindowPtr) baseWindow,kWindowGlobalPortRgn,&wRect);
-
- while(SectRect(&mainRect, &wRect, nil))
- {
- tDelta.h = tDelta.v = 0;
- switch(direction)
- {
- case 0:
- case 4:
- case 12:
- tDelta.h=kHOffset;
- break;
- case 1:
- case 5:
- case 9:
- tDelta.v=-kVOffset;
- break;
- case 2:
- case 6:
- case 10:
- tDelta.h=-kHOffset;
- break;
- case 3:
- case 7:
- case 11:
- tDelta.v=kVOffset;
- break;
- case 8:
- tDelta.v=-kVOffset;
- tDelta.h=kHOffset;
- break;
- }
-
- // tDelta.h += Rand(-3,3);
- // tDelta.v += Rand(-2,2);
-
- OffsetRect(&wRect,tDelta.h,tDelta.v);
- MoveWindow((WindowPtr)baseWindow, wRect.left, wRect.top, false);
-
- // (void) GetWindowBounds((WindowPtr) baseWindow,kWindowGlobalPortRgn,&wRect);
-
- SectRect(&sRect, &wRect, &tRect);
- if (!EqualRect(&wRect, &tRect))
- {
- MoveWindow((WindowPtr)baseWindow, wRect.left - tDelta.h, wRect.top - tDelta.v, false);
- direction++;
- (void) GetWindowBounds((WindowPtr) baseWindow,kWindowGlobalPortRgn,&wRect);
- if (dHandle)
- {
- HLock(dHandle);
- SndPlay(theChannel, (SndListHandle)dHandle, true);
- HUnlock(dHandle);
- }
-
- }
- if (direction > 8)
- break;
- }
- }
- gInMoveWindows = false;
- }
-
- // Function Prototypes
- extern pascal void my_DragWindowPatch(WindowRef window, Point startPt, const Rect *boundsRect);
- extern pascal long my_NewCWindowPatch(void * wStorage,
- const Rect * boundsRect,
- ConstStr255Param title,
- Boolean visible,
- short procID,
- WindowRef behind,
- Boolean goAwayFlag,
- long refCon);
- extern pascal void my_SelectWindowPatch(WindowRef window);
-
-
- // Globals to hold original routine descriptors
- RoutineDescriptorPtr gOriginal_DragWindow = nil;
- RoutineDescriptorPtr gOriginal_NewCWindow = nil;
- RoutineDescriptorPtr gOriginal_SelectWindow = nil;
-
-
- // Tell MetroWerks the procInfo for main
- ProcInfoType __procinfo = kPascalStackBased;
- pascal void main(void)
- {
- RoutineDescriptorPtr originaldesc, newdesc, unImplimentedTrapAddr;
- UInt32 size;
- UInt16 index;
- THz theZone;
-
- // get globals
- EnterCodeResource();
- // detach ourselves
- DetachResource(Get1Resource('INIT', 0));
-
- // make sure we are in the system heap
- theZone = GetZone();
- SetZone(SystemZone());
-
- unImplimentedTrapAddr = NGetTrapAddress(_Unimplemented, (_Unimplemented & 0x0800) ? ToolTrap : OSTrap);
-
- originaldesc = NGetTrapAddress(_DragWindow, (_DragWindow & 0x0800) ? ToolTrap : OSTrap);
- if (originaldesc != unImplimentedTrapAddr) {
- if (originaldesc->goMixedModeTrap != _MixedModeMagic) {
- // Trap is 68K
- size = sizeof(RoutineDescriptor) + (sizeof(RoutineRecord) * 1);
- // allocate new descriptor
- newdesc = (RoutineDescriptorPtr) NewPtrSys(size);
- if (!newdesc) {
- Debugger();
- return;
- }
- // set fields of routine decscriptor
- newdesc->goMixedModeTrap = _MixedModeMagic;
- newdesc->version = 7;
- newdesc->routineDescriptorFlags = 0;
- newdesc->reserved1 = 0;
- newdesc->reserved2 = 0;
- newdesc->selectorInfo = 0;
- newdesc->routineCount = 0;
- index = 0;
- gOriginal_DragWindow = originaldesc;
- newdesc->routineRecords[index].procInfo = upp_DragWindowProcInfo;
- newdesc->routineRecords[index].reserved1 = 0;
- newdesc->routineRecords[index].ISA = GetCurrentArchitecture();
- newdesc->routineRecords[index].routineFlags = 4;
- newdesc->routineRecords[index].procDescriptor = (ProcPtr)my_DragWindowPatch;
- newdesc->routineRecords[index].reserved2 = 0;
- newdesc->routineRecords[index].selector = 0;
- }
- else {
- // Trap is CFM
- size = sizeof(RoutineDescriptor) + (sizeof(RoutineRecord) * originaldesc->routineCount);
- newdesc = (RoutineDescriptorPtr) NewPtrSys(size);
- if (!newdesc) {
- DebugStr("\pFailed to allocate RoutineDescriptor");
- return;
- }
- BlockMoveData(originaldesc, newdesc, size);
- gOriginal_DragWindow = originaldesc;
- index = 0;
- newdesc->routineRecords[index].procDescriptor = (ProcPtr)my_DragWindowPatch;
- newdesc->routineRecords[index].ISA = GetCurrentArchitecture();
- }
- NSetTrapAddress((UniversalProcPtr) newdesc, _DragWindow, (_DragWindow & 0x0800) ? ToolTrap : OSTrap);
- }
-
- originaldesc = NGetTrapAddress(_NewCWindow, (_NewCWindow & 0x0800) ? ToolTrap : OSTrap);
- if (originaldesc != unImplimentedTrapAddr) {
- if (originaldesc->goMixedModeTrap != _MixedModeMagic) {
- // Trap is 68K
- size = sizeof(RoutineDescriptor) + (sizeof(RoutineRecord) * 1);
- // allocate new descriptor
- newdesc = (RoutineDescriptorPtr) NewPtrSys(size);
- if (!newdesc) {
- Debugger();
- return;
- }
- // set fields of routine decscriptor
- newdesc->goMixedModeTrap = _MixedModeMagic;
- newdesc->version = 7;
- newdesc->routineDescriptorFlags = 0;
- newdesc->reserved1 = 0;
- newdesc->reserved2 = 0;
- newdesc->selectorInfo = 0;
- newdesc->routineCount = 0;
- index = 0;
- gOriginal_NewCWindow = originaldesc;
- newdesc->routineRecords[index].procInfo = upp_NewCWindowProcInfo;
- newdesc->routineRecords[index].reserved1 = 0;
- newdesc->routineRecords[index].ISA = GetCurrentArchitecture();
- newdesc->routineRecords[index].routineFlags = 4;
- newdesc->routineRecords[index].procDescriptor = (ProcPtr)my_NewCWindowPatch;
- newdesc->routineRecords[index].reserved2 = 0;
- newdesc->routineRecords[index].selector = 0;
- }
- else {
- // Trap is CFM
- size = sizeof(RoutineDescriptor) + (sizeof(RoutineRecord) * originaldesc->routineCount);
- newdesc = (RoutineDescriptorPtr) NewPtrSys(size);
- if (!newdesc) {
- DebugStr("\pFailed to allocate RoutineDescriptor");
- return;
- }
- BlockMoveData(originaldesc, newdesc, size);
- gOriginal_NewCWindow = originaldesc;
- index = 0;
- newdesc->routineRecords[index].procDescriptor = (ProcPtr)my_NewCWindowPatch;
- newdesc->routineRecords[index].ISA = GetCurrentArchitecture();
- }
- NSetTrapAddress((UniversalProcPtr) newdesc, _NewCWindow, (_NewCWindow & 0x0800) ? ToolTrap : OSTrap);
- }
-
- originaldesc = NGetTrapAddress(_SelectWindow, (_SelectWindow & 0x0800) ? ToolTrap : OSTrap);
- if (originaldesc != unImplimentedTrapAddr) {
- if (originaldesc->goMixedModeTrap != _MixedModeMagic) {
- // Trap is 68K
- size = sizeof(RoutineDescriptor) + (sizeof(RoutineRecord) * 1);
- // allocate new descriptor
- newdesc = (RoutineDescriptorPtr) NewPtrSys(size);
- if (!newdesc) {
- Debugger();
- return;
- }
- // set fields of routine decscriptor
- newdesc->goMixedModeTrap = _MixedModeMagic;
- newdesc->version = 7;
- newdesc->routineDescriptorFlags = 0;
- newdesc->reserved1 = 0;
- newdesc->reserved2 = 0;
- newdesc->selectorInfo = 0;
- newdesc->routineCount = 0;
- index = 0;
- gOriginal_SelectWindow = originaldesc;
- newdesc->routineRecords[index].procInfo = upp_SelectWindowProcInfo;
- newdesc->routineRecords[index].reserved1 = 0;
- newdesc->routineRecords[index].ISA = GetCurrentArchitecture();
- newdesc->routineRecords[index].routineFlags = 4;
- newdesc->routineRecords[index].procDescriptor = (ProcPtr)my_SelectWindowPatch;
- newdesc->routineRecords[index].reserved2 = 0;
- newdesc->routineRecords[index].selector = 0;
- }
- else {
- // Trap is CFM
- size = sizeof(RoutineDescriptor) + (sizeof(RoutineRecord) * originaldesc->routineCount);
- newdesc = (RoutineDescriptorPtr) NewPtrSys(size);
- if (!newdesc) {
- DebugStr("\pFailed to allocate RoutineDescriptor");
- return;
- }
- BlockMoveData(originaldesc, newdesc, size);
- gOriginal_SelectWindow = originaldesc;
- index = 0;
- newdesc->routineRecords[index].procDescriptor = (ProcPtr)my_SelectWindowPatch;
- newdesc->routineRecords[index].ISA = GetCurrentArchitecture();
- }
- NSetTrapAddress((UniversalProcPtr) newdesc, _SelectWindow, (_SelectWindow & 0x0800) ? ToolTrap : OSTrap);
- }
-
- // restore to original heap
- SetZone(theZone);
- // restore globals
- ExitCodeResource();
- }
-
-
- pascal void my_DragWindowPatch(WindowRef window, Point startPt, const Rect *boundsRect)
- {
- // Get globals
- EnterCodeResource();
-
- CALL_THREE_PARAMETER_UPP( gOriginal_DragWindow, upp_DragWindowProcInfo, window, startPt, boundsRect);
-
- MoveWindows();
- gInMoveWindows = false;
- // Release globals
- ExitCodeResource();
- }
-
- pascal long my_NewCWindowPatch(void * wStorage,
- const Rect * boundsRect,
- ConstStr255Param title,
- Boolean visible,
- short procID,
- WindowRef behind,
- Boolean goAwayFlag,
- long refCon)
- {
- long result;
- // Get globals
- EnterCodeResource();
-
- result = CALL_EIGHT_PARAMETER_UPP( gOriginal_NewCWindow, upp_NewCWindowProcInfo,
- wStorage,boundsRect,title,visible,procID,behind,goAwayFlag,refCon);
- MoveWindows();
- gInMoveWindows = false;
- // Release globals
- ExitCodeResource();
- return result;
- }
-
- pascal void my_SelectWindowPatch(WindowRef window)
- {
- // Get globals
- EnterCodeResource();
-
- // DebugStr("\p|my_SelectWindowPatch-I-Debug;");
-
- CALL_ONE_PARAMETER_UPP( gOriginal_SelectWindow, upp_SelectWindowProcInfo, window);
- MoveWindows();
- gInMoveWindows = false;
- // Release globals
- ExitCodeResource();
- }
-
-